﻿// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
/*应用主界面，在主界面的Loadr指定区域显示子对象。
  在主界面上有一个公共的标题，
*/

import QtQuick
import QtQuick.Controls

Item {
    id: app                 //在同一目录或被包含，app都可见。
    anchors.fill: parent    //决定了被加载对象的大小。
    opacity: 0.0            //QQ为什么赋值0.0（全透明）？

    Behavior on opacity { NumberAnimation { duration: 500 } }   //QQ动画吗？

    //The var type is a generic property type that can refer to any data type.For example, var properties can store numbers, strings, objects, arrays and functions.
    property var lastPages: []          //QQ定义一个数组类型[]，类型是var，且未指定元素个数？为什么不使用StackView？从后面可知有length。
    property int __currentIndex: 0      //

    //定义了基类型的3个函数，可以在其他的继承类型中使用。
    function init()
    {
        opacity = 1.0               //QQ为什么又变为不透明？
        //依次压入
        showPage("Connect.qml")     //0:对应TabBar的"scan"项。也会触发Loader下的onStatusChanged。
//        showPage("Measure.qml")     //1:对应TabBar的"connect"项。
//        showPage("Cal.qml")         //2:
//        showPage("ParaPlc.qml")     //3:
//        showPage("ParaSet.qml")     //4:
//        showPage("Boot.qml")        //5:
//        showPage("Key.qml")         //6:
//        showPage("ParaLaji.qml")  //7:
    }


    /*prePage()和showPage()相同之处是setSource()，不同之处是前者出栈，后者压栈。
    */
    function prevPage()
    {
        lastPages.pop()                                         //从数组末尾移除最后一项，减少数组的length值，并返回移除的项。
        pageLoader.setSource(lastPages[lastPages.length-1])     //在Loader指定区域内，装载.qml。始终显示的是lastPages[]最后项对应的.qml文件。
        __currentIndex = lastPages.length-1;                    //__currentIndex总是为(lastPages.length-1).
    }

    function showPage(name)
    {
        lastPages.push(name)                                    //向数组的末尾添加一个或更多元素(var变量，这里应是字符串），并返回新的长度。
        pageLoader.setSource("")
        pageLoader.setSource(name)                              //始终显示的是lastPages[]最后项对应的.qml文件。
        __currentIndex = lastPages.length-1;

        if(name ==="Cal.qml")
            titleBar.currentIndex= 2
    }


    /*TitleBar是自定义控件，内部已定义了自身位置。
    */
    TitleBar {
        id: titleBar
        //currentIndex: __currentIndex            //currentIndex是TitleBar的自定义属性。处于当前状态的项，字是白色，且有白的粗的下划线。
        //currentIndex: index

        onTitleClicked: (index) => {            //titleBar控件有signal：titleClicked(int index)
                            console.log("index=", index)

//                            if (index < __currentIndex)
//                                pageLoader.item.close()         //只能向左切换。哦，哦，是页面的基础UI（GamePage.qml）的function close()，即app.prevPage()。这里的item()返回的不能按QObject，而是GamePage{}。
//                            else if(index> __currentIndex){
                                //向右切换
                              if(index !== __currentIndex){
                                if(0 === index){
                                    showPage("Connect.qml")
                                }
                                else if(1 === index){
                                    showPage("Measure.qml")
                                    currentIndex= index
                                }
                                else if( 2 === index){
                                    showPage("Key.qml");    //showPage("Cal.qml")
                                    currentIndex= index
                                }
                                else if(3 === index){
                                    showPage("Boot.qml");   //showPage("ParaPlc.qml")
                                }
//                                else if(4 === index)
//                                    showPage("ParaSet.qml")
//                                else if(5 === index)
//                                    showPage("Boot.qml")
//                                else if(6 === index)
//                                    showPage("Key.qml")
//                                else if(7 === index)
//                                    showPage("ParaLaji.qml")
                                else
                                    console.log("err: index overflow")

                                currentIndex= index
                            }
                            else{
                                //相等，则不切换。
                            }

                            __currentIndex= index;
                        }
    }

//    ProgressBar{
//        id: progress1
//        anchors.left: parent.left
//        anchors.right: parent.right
//        anchors.top: titleBar.bottom
//        height: titleBar.height              //不指定高度时，
//        width: titleBar.width
//        //anchors.bottom: parent.bottom
//        from: 0; to:1.0
//        value: 0.8
//        //indeterminate: true                 //动态显示，进度条一个方向的动着。
//        //color: "blue"
//        background: Rectangle{
//            color: "blue"
//        }
//        contentItem: Item {   //内容项
//            Rectangle {
//                width: progress1.visualPosition * progress1.width
//                height: progress1.height
//                radius: 2
//                color: "green"
//            }
//        }
//    }

    Loader {    //占位符，用来装载一个新的.qml。
        id: pageLoader                      //为什么叫pageLoaer？因为加载的都是基于GamePage{}的对象。
        anchors.left: parent.left           //通过anchors（锚定）来确定被加载对象（App.qml）的大小。为什么不用parent.width, parent.height。
        anchors.right: parent.right
        anchors.top: titleBar.bottom        //pageLoader在titleBar之下。
        anchors.bottom: parent.bottom

        onStatusChanged: {
            if (status === Loader.Ready)        //the QML source has been loaded. QQ是不是可用Component.onCompleted？
            {
                console.log("11111111111111111111");
                pageLoader.item.init();             //item的类型按GamePage{}中的init()，需要使用.item，不能用pageLoader.init()。是否可用被加载qml中得onComponentCompleted呢？
                pageLoader.item.forceActiveFocus();  //item的类型按Item{}。forceActiveFocus()是Item类型下方法。
            }
            else if (status == Loader.Loading){
                console.log("22222222222222222222")
            }
            else{
                console.log("33333333333333333333")
            }

        }
    }

    /*任何基于Item都有附加属性：Keys。
      对应手机上的什么键，软键（退出箭头）吗？
    */
    Keys.onReleased: (event) => {   //接收按键：实测在windows下按Esc键退出。未试验出Key_Back是什么。
        switch (event.key) {
        case Qt.Key_Escape:
        case Qt.Key_Back: {
            if (__currentIndex > 0) {
                pageLoader.item.close()
                event.accepted = true       //If a key is handled, event.accepted should be set to true to prevent the event from propagating up the item hierarchy.
            } else {
                Qt.quit()
            }
            break;
        }
        default: break;
        }
    }

    BluetoothAlarmDialog {
        id: btAlarmDialog
        anchors.fill: parent                //填充整个屏幕（含TitleBar，Loader），即不让再操作了。所以要关注Z轴顺序。
        visible: !connectionHandler.alive   //QQ默认不显示。
    }
}
